#include "user.h"

IO_CtrlStruct IO_List[PIN_MAX];
void IO_ConfigAll(void)
{
	uint8_t i;
	GPIO_InitTypeDef GPIO_InitStructure;
	for(i = 0; i < PIN_MAX; i++)
	{
		IO_List[i].WorkMode = 1;
		IO_List[i].Mode = GPIO_Mode_Out_PP;
		IO_List[i].Speed = GPIO_Speed_50MHz;
		IO_List[i].InitVal = 0;
		IO_List[i].IsReverse = 0;
	}

	IO_List[PIN_CPU_STATE].PinNo = 8;
	IO_List[PIN_CPU_STATE].Port = GPIOA;
	IO_List[PIN_CPU_STATE].InitVal = 1;

	IO_List[PIN_IOT_POWER].PinNo = 4;
	IO_List[PIN_IOT_POWER].Port = GPIOA;
	IO_List[PIN_IOT_POWER].InitVal = 0;

//	IO_List[PIN_DTR].PinNo = 5;
//	IO_List[PIN_DTR].Port = GPIOA;
//	IO_List[PIN_DTR].InitVal = 0;

	for(i = 0; i < PIN_MAX; i++)
	{
		if (IO_List[i].WorkMode)
		{
			GPIO_InitStructure.GPIO_Mode = IO_List[i].Mode;
			GPIO_InitStructure.GPIO_Speed = IO_List[i].Speed;
			GPIO_InitStructure.GPIO_Pin = 1 << IO_List[i].PinNo;
			GPIO_Init(IO_List[i].Port, &GPIO_InitStructure);
		}
		IO_Write(i,IO_List[i].InitVal);
	}
}


void IO_Write(uint8_t Sn, uint8_t Val)
{
	if (Sn >= PIN_MAX)
	{
		DBGF;
		return;
	}
	if (IO_List[Sn].WorkMode == 1)
	{
		if (IO_List[Sn].IsReverse)
		{
			Val = !Val;
		}
		//DBG_INFO("%x %d %d", IO_List[Sn].Port, IO_List[Sn].PinNo, Val);
		GPIO_WriteBit(IO_List[Sn].Port, 1 << IO_List[Sn].PinNo, (Val > 0)?Bit_SET:Bit_RESET);
	}
	else
	{
		DBG_INFO("%x %d %d", IO_List[Sn].Port, IO_List[Sn].PinNo, IO_List[Sn].WorkMode);
	}

}
uint8_t IO_Read(uint8_t Sn)
{
	uint8_t Val = 0;
	if (Sn >= PIN_MAX)
	{
		DBGF;
		return 0;
	}
	if (IO_List[Sn].WorkMode == 2)
	{

		Val = GPIO_ReadInputDataBit(IO_List[Sn].Port, 1 << IO_List[Sn].PinNo);
		if (IO_List[Sn].IsReverse)
		{
			Val = !Val;
		}
	}
	return Val;
}
